﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateExample
{

	class Program
	{
		/// <summary>
		/// Делегат с параметрами
		/// </summary>
		/// <param name="strArray">Массив строк</param>
		/// <param name="strDelimiter">Разделитель</param>
		public delegate void myStrDelegate(string[] strArray, string strDelimiter);
		/// <summary>
		/// Делегат без параметров
		/// </summary>
		public delegate void DelegateTestArray();


		static void Main(string[] args)
		{

			// Объявим 3 массива
			string[] myArr1 = { "1", "11", "111", "1111", "11111" };
			string[] myArr2 = { "2", "22", "222", "2222", "22222" };
			string[] myArr3 = { "3", "33", "333", "3333", "33333" };

			// 1)
			Console.WriteLine("Вывод массива-1 с помощью метода класса:");
			DelegateStat.Arrau2Console(myArr1, "-");
			// 2)
			Console.WriteLine("Вывод массива-1 с помощью делегата:");
			myStrDelegate StrOutviaDelegate = DelegateStat.Arrau2Console;
			StrOutviaDelegate(myArr1, "-");
			// 3)
			Console.WriteLine("Один вызов группового делегата на основе группировки анонимных методов: ");
			DelegateTestArray StrOutviaAnonymDelegate = delegate() { DelegateStat.Arrau2Console(myArr1, "-"); };
			StrOutviaAnonymDelegate += delegate() { DelegateStat.Arrau2Console(myArr2, "-"); };
			StrOutviaAnonymDelegate += delegate() { DelegateStat.Arrau2Console(myArr3, "-"); };
			StrOutviaAnonymDelegate(); // вызов всех методов делегата поочереди
			// 4)
			Console.WriteLine("Вывод массива-1 с помощью универсального делегата Action:");
			Action<string[], string> f = (Arr, Delim) =>
			{
				for (int i = 0; i < Arr.Length; i++)
				{
					if (i < Arr.Length - 1)
						Console.Write(Arr[i] + Delim);
					else
						if (i == Arr.Length - 1)
						{
							Console.Write(Arr[i]);
							Console.WriteLine();
						}
				}
			};
			f(myArr1, "-");

			// 5)
			Console.WriteLine("Вывод массивов с помощью лямбда-выражения");
			DelegateTestArray d = () => DelegateStat.Arrau2Console(myArr1, "-");
			d += () => DelegateStat.Arrau2Console(myArr2, "-");
			d += () => DelegateStat.Arrau2Console(myArr3, "-");
			d();
			// 6)
			Console.WriteLine("Вывод массивов с помощью лямбда-оператора:");
			DelegateTestArray d2 = () =>
			{
				DelegateStat.Arrau2Console(myArr1, "-");
				DelegateStat.Arrau2Console(myArr2, "-");
				DelegateStat.Arrau2Console(myArr3, "-");
			};
			d2();


			/*								   // стандартный делегат Action
			var StrOutviaDelegate = new Action(delegate() { DelegateStat.Arrau2Console(myArr1, "-"); });
			StrOutviaDelegate += new Action(delegate() { DelegateStat.Arrau2Console(myArr2, "-"); });
			StrOutviaDelegate += new Action(delegate() { DelegateStat.Arrau2Console(myArr3, "-"); });
			StrOutviaDelegate();
			*/	
		}
	}
}
